﻿/*
 * Version 0.4.2.0: 26 feb 2011
 * Scharoun, Adrian, Víctor Hugo.
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic;
using System.Text;
using Escuela.UI;

namespace Escuela
{
    class Program
    {
        struct Signatures
        {
            public static readonly string System = "System>";
            public static readonly string Alumno = "Alumno>";
            public static readonly string Docente = "Docente>";
            public static readonly string Pregunta = "Introducir>";
        }

        private static bool run = true;

        private static SchoolList escuela = new SchoolList();
        static void Main(string[] args)
        {
            try
            {
                escuela.Load("MyEscuela.xml");

            }
            catch (Exception ex)
            {
#if DEBUG
                UI.ConsoleHelper.WriteLine(ex.Message, Signatures.System, null);
#endif
                UI.ConsoleHelper.WriteLine("No se puede cargar la base de datos", Signatures.System, null);
            }

            ConsoleColor PrevBG = Console.BackgroundColor;
            ConsoleColor PrevFB = Console.ForegroundColor;

            UI.ConsoleHelper.Header();

            Console.BackgroundColor = PrevBG;
            Console.ForegroundColor = PrevFB;

            DoIO();

        }

        static void DoIO()
        {

            

            ConsoleHelper.WriteLine("Que desea hacer?", Signatures.System, null);

            string[] input = ConsoleHelper.ReadLine(Signatures.Pregunta).Split(' ');

            switch (input[0])
            {
                case "NuevoAlumno":
                    escuela.Add(AskAlumno());
                    break;

                case "NuevoDocente":
                    escuela.Add(AskDocente());
                    break;

                case "EliminarPersona":
                    escuela.Remove(escuela[input[1]]);
                    break;

                case "AgregarMateria":
                    ((Alumno)escuela[input[1]]).Materias.Add(AskMateria());
                    break;

                case "EliminarMateria":
                    escuela.EliminarMateria(input[1], input[2]);
                    break;

                case "AgregarAsignatura":
                    ((Docente)escuela[input[1]]).Asignaturas.Add(AskMateria());
                    break;

                case "EliminarAsignatura":
                    escuela.EliminarAsignatura(input[1], input[2]);
                    break;

                case "EditarAlumno":
                    string matricula = input[1];
                    escuela[matricula] = AskAlumno();
                    break;

                case "EditarDocente":
                    escuela[input[1]] = AskDocente();
                    break;

                case "Save":
                    escuela.Save();
                    break;

                case "Alumnos":
                    foreach (Alumno item in escuela.Alumnos())
                    {
                        ConsoleHelper.WriteLine("{0}: {1}", item.Nombre + ">", item.Matricula, item.Nombre);
                        "Materias:".WriteLine();
                        foreach (Materia materia in item.Materias)
                        {
                            ConsoleHelper.WriteLine("{0}: {1} | {2} | {3} | {4}", item.Nombre + ">",
                                materia.Nombre, materia.Profesor, materia.HoraInicio.ToShortTimeString(),
                                materia.HoraTermino.ToShortTimeString(), materia.Salon);
                        }

                        Console.WriteLine(item == "10280");
                    }
                    break;

                     
                case "Docentes":
                    foreach (Docente item in escuela.Docentes())
                    {
                        ConsoleHelper.WriteLine("{0}: {1}", item.Nombre + ">", item.Matricula, item.Nombre);
                        ConsoleHelper.WriteLine("Materias", item.Nombre + ">", null);
                        foreach (Materia materia in item.Asignaturas)
                        {
                            ConsoleHelper.WriteLine("{0}: {1} | {2} | {3} | {4}", item.Nombre + ">",
                                materia.Nombre, materia.Profesor, materia.HoraInicio.ToShortTimeString(),
                                materia.HoraTermino.ToShortTimeString(), materia.Salon);
                        }
                    }
                    break;

                case "Alumno":
                    Alumno alumno = (Alumno)escuela.SingleOrDefault((a) => a.Matricula == input[1]);
                    if (alumno == null)
                    {
                        "No existe un alumno con esta matricula".WriteLine();
                    }
                    else
                    {
                        ConsoleHelper.WriteLine("{0}: {1}", alumno.Nombre + ">", 
                            alumno.Matricula, alumno.Nombre);
                        foreach (Materia materia in alumno.Materias)
                        {
                            ConsoleHelper.WriteLine("{0}: {1} | {2} | {3} | {4}",
                                alumno.Nombre + ">",
                                materia.Nombre, materia.Profesor, materia.HoraInicio.ToShortTimeString(),
                                materia.HoraTermino.ToShortTimeString(), materia.Salon);

                           
                        }

                    }
                    break;

                case "Docente":
                    Docente docente = (Docente)escuela.SingleOrDefault((a) => a.Matricula == input[1]);
                    if (docente == null)
                    {
                        "No existe un alumno con esta matricula".WriteLine();
                    }
                    else
                    {
                        ConsoleHelper.WriteLine("{0}: {1}", docente.Nombre + ">", 
                            docente.Matricula, docente.Nombre);
                        foreach (Materia materia in docente.Asignaturas)
                        {
                            ConsoleHelper.WriteLine("{0}: {1} | {2} | {3} | {4}", docente.Nombre + ">",
                                materia.Nombre, materia.Profesor, materia.HoraInicio.ToShortTimeString(),
                                materia.HoraTermino.ToShortTimeString(), materia.Salon);
                        }

                    }
                    break;

                case "find":
                    string scope = input[1];
                    string query = input[2];
                    switch (scope)
                    {
                        case "Alumnos":
                            //try
                            //{
                                foreach (Alumno a in escuela.Alumnos().AsQueryable().Where(query, null))
                                {
                                    Console.WriteLine("{0}: {1}", a.Nombre + ">", a.Matricula, a.Nombre);
                                    "Materias:".WriteLine();
                                    foreach (Materia materia in a.Materias)
                                    {
                                        Console.WriteLine("{0}: {1} | {2} | {3} | {4}", a.Nombre + ">", 
                                            materia.Nombre, materia.Profesor, materia.HoraInicio.ToShortTimeString(),
                                            materia.HoraTermino.ToShortTimeString(), materia.Salon);
                                    }
                                }
                            //}
                            //catch{ }
                                break;

                        case "Docentes":
                            try
                            {
                                foreach (Docente d in escuela.Docentes().AsQueryable().Where(query, null))
                                {
                                    Console.WriteLine("{0}: {1}", d.Nombre + ">", d.Matricula, d.Nombre);
                                    "Materias:".WriteLine();
                                    foreach (Materia materia in d.Asignaturas)
                                    {
                                        Console.WriteLine("{0}: {1} | {2} | {3} | {4}", d.Nombre + ">",
                                            materia.Nombre, materia.Profesor, materia.HoraInicio.ToShortTimeString(),
                                            materia.HoraTermino.ToShortTimeString(), materia.Salon);
                                    }
                                }
                            }
                            catch
                            { }
                            break;

                        case "Todos":
                            try
                            {
                                foreach (Persona p in escuela.AsQueryable().Where(query, null))
                                {
                                    Console.WriteLine("{0}: {1}", Signatures.System, p.Matricula, p.Nombre);
                                }
                            }
                            catch { }
                            break;

                    }
                    break;

                case "Salir":
                    exit();
                    break;

                case "Clear":
                    Console.Clear();
                    break;
            }

            if (run) DoIO();

        }
        
        static Persona AskPersona(Persona.TiposDePersona tipo)
        {
            Persona persona = new Persona();

            

            List<string> preguntas = new List<string>();
            preguntas.Add("Nombre");
            preguntas.Add("Matricula");
            preguntas.Add("Telefono");
            preguntas.Add("Edad");
            preguntas.Add("Sexo");

            string QuestionFormtatter = "Cual es tu {0}";

            Dictionary<string, string> resultados =
                UI.ConsoleHelper.Ask(preguntas, QuestionFormtatter);

            persona.Id = Guid.NewGuid().ToString();
            persona.Nombre = resultados["Nombre"];
            persona.Matricula = resultados["Matricula"];
            persona.Telefono = resultados["Telefono"];
            persona.Edad = short.Parse(resultados["Edad"]);
            persona.Sexo = (Persona.Sexos)Enum.Parse(typeof(Persona.Sexos), resultados["Sexo"]);
            persona.TipoDePersona = tipo;

           

            return persona;
        }

        static Alumno AskAlumno()
        {
            Alumno persona = new Alumno();



            List<string> preguntas = new List<string>();
            preguntas.Add("Nombre");
            preguntas.Add("Matricula");
            preguntas.Add("Telefono");
            preguntas.Add("Edad");
            preguntas.Add("Sexo");

            string QuestionFormtatter = "Cual es tu {0}";

            Dictionary<string, string> resultados =
                UI.ConsoleHelper.Ask(preguntas, QuestionFormtatter);

            persona.Id = Guid.NewGuid().ToString();
            persona.Nombre = resultados["Nombre"];
            persona.Matricula = resultados["Matricula"];
            persona.Telefono = resultados["Telefono"];
            persona.Edad = short.Parse(resultados["Edad"]);
            persona.Sexo = (Persona.Sexos)Enum.Parse(typeof(Persona.Sexos), resultados["Sexo"]);
            persona.TipoDePersona = Persona.TiposDePersona.Alumno;

            persona.Materias = new List<Materia>();

            return persona;
        }

        static Docente AskDocente()
        {
            Docente persona = new Docente();



            List<string> preguntas = new List<string>();
            preguntas.Add("Nombre");
            preguntas.Add("Matricula");
            preguntas.Add("Telefono");
            preguntas.Add("Edad");
            preguntas.Add("Sexo");

            string QuestionFormtatter = "Cual es tu {0}";

            Dictionary<string, string> resultados =
                UI.ConsoleHelper.Ask(preguntas, QuestionFormtatter);

            persona.Id = Guid.NewGuid().ToString();
            persona.Nombre = resultados["Nombre"];
            persona.Matricula = resultados["Matricula"];
            persona.Telefono = resultados["Telefono"];
            persona.Edad = short.Parse(resultados["Edad"]);
            persona.Sexo = (Persona.Sexos)Enum.Parse(typeof(Persona.Sexos), resultados["Sexo"]);
            persona.TipoDePersona = Persona.TiposDePersona.Docente;

            persona.Practicas = new List<string>();
            persona.Asignaturas = new List<Materia>();

            return persona;

        }

        static Materia AskMateria()
        {
            Materia materia = new Materia();

            List<string> preguntas = new List<string>();
            preguntas.Add("Nombre");
            preguntas.Add("Profesor");
            preguntas.Add("Salon");
            preguntas.Add("Hora de inicio");
            preguntas.Add("Hora de fin");

            string QuestionFormatter = "Esciba {0}:";

            Dictionary<string, string> resultados =
                UI.ConsoleHelper.Ask(preguntas, QuestionFormatter);

            materia.Nombre = resultados["Nombre"];
            materia.Profesor = resultados["Profesor"];
            materia.Salon = resultados["Salon"];
            materia.HoraInicio = DateTime.Parse(resultados["Hora de inicio"]);
            materia.HoraTermino = DateTime.Parse(resultados["Hora de fin"]);
            materia.ID = 0;

            return materia;
        }
                

        static void exit()
        {
            ConsoleHelper.WriteLine("¿Está segudo que desea salir?", Signatures.System, null);
            switch (ConsoleHelper.ReadLine(Signatures.System).ToLower())
            {
                case "si":
                    run = false;
                    break;

                case "no":
                    DoIO();
                    break;
                default :
                    exit();
                    break;
            }
        }
                
    }
}
